package controller;
import model.User;
import model.UserMapper;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.sql.SQLException;

@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //告诉Servlet该如何解析请求中的数据
//        req.setCharacterEncoding("utf8");
        req.setCharacterEncoding("utf8");
        //获取登录页面表单传过来的用户名和对应密码
        String username=req.getParameter("username");
        String password=req.getParameter("password");
        System.out.println(username+"  "+password);
        //判断表单数据是否合法()
        if(username==null||username.equals("")||password==null||password.equals("")){
            //满足任何一种情况都是表单提交的数据不完整
            resp.setContentType("text/html;charset=utf8");
            resp.getWriter().write("登陆页面提交的用户信息不完整");
            return;
        }

        //表单数据合法时，查找用户信息,查询数据库(校验用户和密码是否在数据库中相互对应)
        UserMapper userMapper=new UserMapper();
        User user = null;
        try {
            user=userMapper.selectByName(username);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        //判断是否在数据库中找到是否存在该用户名
        if(user==null){
            resp.setContentType("text/html;charset=utf8");
            resp.getWriter().write("用户名不存在");
            return;
        }
        //检查该用户名的密码是否正确
        if(!user.getPassword().equals(password)){
            resp.setContentType("text/html;charset=utf8");
            resp.getWriter().write("该用户输入的密码错误");
            return;
        }

        //到这里用户的名字和密码都在数据库中匹配成功
        //首先创建一个新的Session对话,并返回HttpSession对象
        HttpSession session= req.getSession(true);
        session.setAttribute("user",user);//将刚刚登陆成功的用户对象写进session中，便于后续使用
        //页面跳转到博客页(blog_List)
        resp.setStatus(302);//设置状态码302(重定向)
        resp.sendRedirect("blog_List.html");
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取Session对话中的HttpSession对象
        HttpSession session= req.getSession(false);
        //如果获取失败则页面跳转到登陆页面(blog_login)
        if(session==null){
            resp.setStatus(403);//设置状态码403(权限不足)
            //注意这里不使用重定向的原因是因为ajax不能通过302状态码直接进行页面跳转
            //例如表单就可以302重定向进行跳转
//            resp.encodeRedirectURL("blog_List.html");
            return;
        }

        //获取存储在session中的键值对(登陆时设置进session中的user对象)
        User user= (User) session.getAttribute("user");
        //注意判断user==null这一步操作操作，我一开始很疑惑，因为
        //一开始我认为既然已经获取到了session对象，那么自然储存在
        //session中的user对象也一定存在，其实不然，这要等到写了
        //退出用户登录功能时才能解释
        if(user==null){
            resp.setStatus(403);//设置状态码403(权限不足)
//            resp.encodeRedirectURL("blog_List.html");
            return;
        }
        //上述两种情况都没问题的话，则用户已登陆,直接返回200
        resp.setStatus(200);
    }
}
